package com_.dxy_.test_.aop_test_.aspect_;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @Description 代理TestAopServiceV1Impl的切面类
 * @Author dangxianyue
 * @Date 2022/9/27 10:07
 */
@Order(1)//多切面的顺序，数字越大越靠后
//@Component
@Aspect
public class ServiceV1Aspect02 {

    /**
     * 切入点，代理指定bean中的所有方法
     */
    @Pointcut("bean(testAopServiceV1Impl)")
    public void pointcut() {
    }

    /**
     * 前置通知
     */
    @Before("pointcut()")
    public void before() {
        System.out.println("2、ServiceV1Aspect02切面 > @Before, 前置通知");
    }

    /**
     * 后置通知
     */
    @After("pointcut()")
    public void after() {
        System.out.println("4、ServiceV1Aspect02切面 > @After, 后置通知");
    }

    /**
     * 后置通知
     */
    @AfterReturning("pointcut()")
    public void afterReturning() {
        System.out.println("3、ServiceV1Aspect02切面 > @AfterReturning, 返回通知");
    }

    /**
     * 后置通知
     */
    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        System.out.println("ServiceV1Aspect02切面 > @AfterThrowing, 异常通知");
    }

    /**
     * 环绕通知
     */
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        try {
            long start = System.currentTimeMillis();
            System.out.println("1、ServiceV1Aspect02切面 > @Around, 环绕通知");
            Object result = jp.proceed();//调用目标方法
            System.out.println("5、ServiceV1Aspect02切面 > @Around, 环绕通知，目标方法调用结束，耗时：" + (System.currentTimeMillis()-start));
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
            throw e;
        }
    }


}
